package com.rejuvee.myloginapplication.data;

import androidx.annotation.NonNull;

/**
 * 网络调用的结果实体
 * <p>
 * 一个泛型类，在data或错误异常中保存结果。
 */
public class Result<T> {

    private Result() {
        // 私有的构造函数,以限制子类类型(只能 成功Success 错误Error)
    }

    /**
     * 成功的结果实体
     */
    public final static class Success<T> extends Result<T> {
        // 成功包含的数据
        private final T data;

        public Success(T data) {
            this.data = data;
        }

        public T getData() {
            return this.data;
        }
    }

    /**
     * 错误的结果实体
     */
    public final static class Error<E> extends Result<E> {
        // 失败包含的异常
        private final Exception error;

        public Error(Exception error) {
            this.error = error;
        }

        public Exception getError() {
            return this.error;
        }
    }

    /**
     * 字符串转换
     */
    @NonNull
    @Override
    public String toString() {
        if (this instanceof Result.Success) {
            Result.Success<?> success = (Result.Success<?>) this;
            return "Success[data=" + success.getData().toString() + "]";
        } else if (this instanceof Result.Error) {
            Result.Error<?> error = (Result.Error<?>) this;
            return "Error[exception=" + error.getError().toString() + "]";
        }
        return "";
    }
}